package top.yehot.cmmu.mybatis.utils;

import java.io.File;
import java.util.Collections;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * <p>代码生成器</p>
 * 文档地址：<a>https://mp.baomidou.com/guide/generator-new.html#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8</a>
 * 
 * @author lquan
 * @date 2022-9-10 11:44:48
 */
public class MybatisPlusGeneratorUtil {
	
	private String url;
	private String username;
	private String password;
	
	public MybatisPlusGeneratorUtil(String url, String username, String password) {
		this.url = url;
		this.username = username;
		this.password = password;
	}
	
	/**
	 * 生成代码(所有表)
	 * 
	 * @param author 作者
	 * @param packagePath 包路径
	 */
	public void generatorAll(String author, String packagePath) {
		generator(author, packagePath, true);
	}
	
	/**
	 * 生成代码(指定表)
	 * 
	 * @param author 作者
	 * @param packagePath 包路径
	 */
	public void generatorMade(String author, String packagePath, String... tables) {
		generator(author, packagePath, false, tables);
	}
	
	private void generator(String author, String packagePath, boolean all, String... tables) {
		FastAutoGenerator.create(url, username, password).globalConfig(builder -> {
			builder
				.author(author) // 作者
	            .enableSwagger() // 开启 swagger 模式
				.fileOverride() // 覆盖已生成文件
				.disableOpenDir() // 禁止打开输出目录
				.outputDir(javaXml()); // 指定输出目录
		})
		.packageConfig(builder -> {
			builder
				.parent(packagePath) // 设置父包名
				.moduleName("") // 设置父包模块名
	            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, mapperXml())); // 设置mapper.xml生成路径
		})
		.strategyConfig(builder -> {
			builder
				.addTablePrefix("t_", "c_", "k_") // 设置过滤表前缀
				
				// ****************** Entity策略配置 ******************
				.entityBuilder()
				.enableLombok() // 开启 lombok 模型
				.enableChainModel() // 开启链式模型
				
				// ****************** Controller策略配置 ******************
				.controllerBuilder()
				.enableRestStyle() // 开启生成 @RestController 控制器
				.enableHyphenStyle() // 开启驼峰转连字符
				
				// ****************** Mapper策略配置 ******************
				.mapperBuilder()
				.enableBaseColumnList() // 启用 BaseResultMap 生成
				.enableBaseResultMap() // 启用 BaseColumnList
				
				// ****************** Service策略配置 ******************
				.serviceBuilder()
				.formatServiceFileName("%sService")
				; 
			if (!all && tables != null && tables.length > 0) {
				builder.addInclude(tables); // 设置需要生成的表名
			}
		})
		.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
		.execute();
	}
	
	private static String getPath() throws Exception {
		try {
			return new File("").getCanonicalPath() + File.separator + "src" + File.separator + "main";
		} catch (Exception e) {
			throw e;
		}
	}
	
	private static String mapperXml() {
		try {
			return getPath() + File.separator + "resources" + File.separator + "mapper" + File.separator;
		} catch (Exception e) {
			System.err.println("error <====> 获取mapper.xml生成路径失败，" + e.getMessage());
			return "D://mybatisPlus//";
		}
	}
	
	private static String javaXml() {
		try {
			return getPath() + File.separator + "java" + File.separator;
		} catch (Exception e) {
			System.err.println("error <====> 获取java文件生成路径失败，" + e.getMessage());
			return "D://mybatisPlus//";
		}
	}
}